Giải thuật Bresenham Giải thuật Bresenham vẽ đoạn thẳng

Minh họa kết quả của giải thuật Bresenham. (0,0) là điểm trên cùng bên trái.

Đoạn thẳng được vẽ giữa hai điểm (x0,y0) và (x1,y1), trong đó x0, x1 là các tọa độ cột, còn y0,y1 là các tọa độ hàng, số thứ tự của chúng tăng dần từ trái sang phải và từ trên xuống dưới.

Giải thuật ban đầu sẽ được trình bày chỉ cho trường hợp góc phần tám, trong đó đoạn thẳng đi xuống và sang phải (x0≤x1 và y0≤y1), và hình chiếu ngang của nó x 1 − x 0 {\displaystyle x_{1}-x_{0}} dài hơn hình chiếu đứng y 1 − y 0 {\displaystyle y_{1}-y_{0}} (đường thẳng có hệ số góc nhỏ hơn 1 và lớn hơn 0), hay góc nghiêng của đường thẳng so với phương ngang nhỏ hơn 45 độ.Trong góc phần tám này, với mỗi cột x nằm giữa x 0 {\displaystyle x_{0}} và x 1 {\displaystyle x_{1}} , có chính xác một hàng y (được tính bởi giải thuật) chứa một pixel của đường thẳng, trong khi đó mỗi hàng nằm giữa y 0 {\displaystyle y_{0}} và y 1 {\displaystyle y_{1}} có thể chứa nhiều rasterized pixels.

Phương trình tổng quát của đường thẳng đi qua hai điểm:

y − y 0 y 1 − y 0 = x − x 0 x 1 − x 0 . {\displaystyle {\frac {y-y_{0}}{y_{1}-y_{0}}}={\frac {x-x_{0}}{x_{1}-x_{0}}}.}

Vì chúng ta biết cột = x, nên hàng của pixel - y được tính bằng cách làm tròn giá trị sau đây đến số nguyên gần nhất:

y = y 1 − y 0 x 1 − x 0 ( x − x 0 ) + y 0 . {\displaystyle y={\frac {y_{1}-y_{0}}{x_{1}-x_{0}}}(x-x_{0})+y_{0}.}

Tuy nhiên, tính giá trị chính xác của biểu thức này là không cần thiết, cần chú ý rằng y tăng từ y0 và sau mỗi bước chúng ta thêm vào x một đơn vị và thêm vào y giá trị của hệ số góc s = ( y 1 − y 0 ) / ( x 1 − x 0 ) {\displaystyle (y_{1}-y_{0})/(x_{1}-x_{0})} . Hệ số góc s chỉ phụ thuộc vào các tọa độ điểm mút nên có thể tính trước được. Hơn nữa, ở mỗi bước chúng ta chọn làm một trong hai việc: hoặc là giữ nguyên y, hoặc là tăng y lên 1 đơn vị.

Có thể giải quyết việc lựa chọn này bằng cách lần theo giá trị sai số. Giá trị sai số là khoảng cách giữa giá trị y hiện tại và giá trị y chính xác đối với x hiện tại. Mỗi lần khi chúng ta tăng x, chúng ta sẽ tăng thêm vào giá trị sai số một đại lượng s, s là hệ số góc nói ở trên. Nếu sai số vượt quá 0.5, rasterization y sẽ được tăng thêm 1 (đường thẳng tiếp tục trên hàng raster bên dưới tiếp theo) và sai số giảm đi 1.0.

Trong mẫu mã giả dưới đây plot(x,y) vẽ một điểm và abs trả về giá trị tuyệt đối:

function line(x0, x1, y0, y1)int deltax:= x1 - x0int deltay:= y1 - y0real error:= 0real deltaerr:= deltay / deltax  // Giả định deltax!= 0 (đường thẳng không thẳng đứng), // chú ý: phép chia này cần được thực hiện sao cho nó có thể giữ lại phần thập phânint y:= y0for x from x0 to x1  plot(x,y)  error:= error + deltaerr  if abs(error) ≥ 0.5 then  y:= y + 1  error:= error - 1.0

Tài liệu tham khảo

WikiPedia: Giải thuật Bresenham vẽ đoạn thẳng http://programmers-lounge-basicgraphics.blogspot.c... http://rooparam.blogspot.com/2009/09/bresenhams-li... http://www.chez.com/pmaillot http://www.cobrabytes.com/index.php?topic=1150.0 http://www.finalcog.com/bresenham-line-algorithm-p... http://sites.google.com/site/proyectosroboticos/br... http://www.research.ibm.com/journal/sj/041/ibmsjIV... http://www.pdp8online.com/563/563.shtml http://tide4javascript.com/?s=Bresenham http://www.cs.helsinki.fi/group/goa/mallinnus/line...